package org.tgcloud.group.core.WXUtils.alipay.request;

import com.google.common.collect.Lists;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.tgcloud.group.core.WXUtils.alipay.AlipayConfig;
import org.tgcloud.group.core.WXUtils.alipay.AlipayCore;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by cloudLiu on 2015/8/24.
 */
public class TelPayRequest{

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    /*
    * 接口名称
    * String
    * 接口名称。固定值。 手机app支付：mobile.securitypay.pay
    * 不可空
    */
    private String service;

    /*
    合作者身份 ID
    String(16)
    签约的支付宝账号对应的支付宝唯一用户号。以 2088 开头的 16 位纯数字组成。
    不可空
    */
    private String partner;

    /*
    参数编码字符集
    String
    商户网站使用的编码格式，固 定为 utf-8。
    不可空
    */
    private String _input_charset;

    /*
    * 签名方式
    * String
    * 签名类型，目前仅支持 RSA。
    * 不可空
    */
    private String sign_type;

    /*
    * 签名
    * String
    * 签名详见sign方法
    * 不可空
    */
    private String sign;

    /*
    * 服务器异步通知页面路径
    * String(200)
    * 支付宝服务器主动通知商户网站里指定的页面 http 路径。
    * 不可空
    */
    private String notify_url;

    /*
    客户端号
    String
    标识客户端。
    可空
    */
    private String app_id;

    /*
    * 客户端来源
    * String
    * 标识客户端来源。参数值内容约定如下：appenv=”system=客户端平台名^version=业务系统版本”，例如：appenv=”system=iphone^version=3.0.1.2”appenv=”system=ipad^version=4.0.1.1”
    * 可空
    */
    private String appenv;

    /*
    商户网站唯一订单号
    String(64)
    支付宝合作商户网站唯一订单号。
    不可空
    */
    private String out_trade_no;

    /*
    商品名称
    String(128)
    商品的标题/交易标题/订单标题/订单关键字等。该参数最长为 128 个汉字。
    不可空
    */
    private String subject;

    /*
    * 支付类型
    * String(4 )
    * 支付类型。默认值为： 1（商品购买）。
    * 不可空
    */
    private String payment_type;

    /*
    卖家支付宝账号
    String(16)
    卖家支付宝账号（邮箱或手机号码格式）或其对应的支付宝唯一用户号（以 2088 开头的纯 16 位数字）。
    不可空
    */
    private String seller_id;

    /*
    总金额
    Number
    该笔订单的资金总额，单位为RMB-Yuan。取值范围为[0.01， 100000000.00]，精确到小数点后两位。
    不可空
    */
    private String total_fee;

    /*
    商品详情
    String(512)
    对一笔交易的具体描述信息。
    如果是多种商品，请将商品描
    述字符串累加传给 body。
    不可空*/
    private String body;

    /*
    未付款交易的超时时间
    String
    设置未付款交易的超时时间，一旦超时，该笔交易就会自动被关闭。当用户输入支付密码、点击确认付款后（即创建支付宝交易后）开始计时。取值范围： 1m～15d，或者使用绝对时间（示例格式：2014-06-13 16:00:00）。
    m-分钟， h-小时， d-天， 1c-当天（无论交易何时创建，都在 0 点关闭）。该参数数值不接受小数点，如1.5h，可转换为 90m。
    可空
    * */
    private String it_b_pay;

    /*授权令牌
    String(3 2)
    开放平台返回的包含账户信息的 token（授权令牌，商户在一定时间内对支付宝某些服务的访问权限）。通过授权登录后获取的
    alipay_open_id，作为该参数的 value，登录授权账户即会为支付账户。
    可空
    */
    private String extern_token;

    public TelPayRequest(String subject, String total_fee, String body , String out_trade_no) {

        this.subject = subject;
        this._input_charset = AlipayConfig.input_charset;
        this.seller_id = AlipayConfig.seller_id;
        this.partner = AlipayConfig.partner;
        this.it_b_pay = AlipayConfig.it_b_pay;
        this.service = AlipayConfig.ali_tel_service;
        this.payment_type = AlipayConfig.payment_type_1;
        this.notify_url = AlipayConfig.notify_url;
        this.out_trade_no = out_trade_no;
        this.total_fee = total_fee;
        this.body = body;
    }

    /**
     * 获取非空的参数map
     * @return
     */
    private Map<String,String> getParams()
    {
        Map<String, String> sParaTemp = new HashMap<String, String>();
        sParaTemp.put("service", this.service);
        sParaTemp.put("partner", this.partner);
        sParaTemp.put("seller_id", this.seller_id);
        sParaTemp.put("_input_charset", this._input_charset);
        sParaTemp.put("payment_type", this.payment_type);
        sParaTemp.put("notify_url", this.notify_url);
        sParaTemp.put("out_trade_no", this.out_trade_no);
        sParaTemp.put("subject", this.subject);
        sParaTemp.put("total_fee", this.total_fee);
        sParaTemp.put("body", this.body);
        sParaTemp.put("it_b_pay", this.it_b_pay);
        return sParaTemp;
    }

    /**
     * 获取返回给手机端的响应
     * @return
     */
    public String getTelResponse() {

        //除去数组中的空值和签名参数
        Map<String, String> sPara = AlipayCore.paraFilter(getParams());
        //生成签名结果
        String mySign = AlipayCore.buildRequestMySign(sPara);

        //签名结果与签名方式加入请求提交参数组中
        try {
            sPara.put("sign", URLEncoder.encode(mySign, "UTF-8"));
        } catch (UnsupportedEncodingException e) {
            logger.warn("encode出错");
            e.printStackTrace();
        }
        sPara.put("sign_type", AlipayConfig.sign_type);
        StringBuilder sb = new StringBuilder();
        List<String> keys_ = Lists.newArrayList();
        for (String key : sPara.keySet())
        {
            keys_.add(key);
        }
        Collections.sort(keys_);
        for (String key : keys_)
        {
            sb.append(key + "=\"" + sPara.get(key) + "\"&");
        }
        sb.deleteCharAt(sb.lastIndexOf("&"));
        logger.warn(sb.toString());
        return sb.toString();
    }

    public String getOut_trade_no() {
        return out_trade_no;
    }

    public void setOut_trade_no(String out_trade_no) {
        this.out_trade_no = out_trade_no;
    }

    public String getTotal_fee() {
        return total_fee;
    }

    public void setTotal_fee(String total_fee) {
        this.total_fee = total_fee;
    }

    @Override
    public String toString() {
        return "TelPayRequest{" +
                "service='" + service + '\'' +
                ", partner='" + partner + '\'' +
                ", _input_charset='" + _input_charset + '\'' +
                ", sign_type='" + sign_type + '\'' +
                ", sign='" + sign + '\'' +
                ", notify_url='" + notify_url + '\'' +
                ", app_id='" + app_id + '\'' +
                ", appenv='" + appenv + '\'' +
                ", out_trade_no='" + out_trade_no + '\'' +
                ", subject='" + subject + '\'' +
                ", payment_type='" + payment_type + '\'' +
                ", seller_id='" + seller_id + '\'' +
                ", total_fee='" + total_fee + '\'' +
                ", body='" + body + '\'' +
                ", it_b_pay='" + it_b_pay + '\'' +
                ", extern_token='" + extern_token + '\'' +
                '}';
    }
}
